package com.gem.day02;

/**
 * 本类用来演示Java运算符
 * 
 * @author easonsy
 * 2020年7月16日 下午3:11:25
 */
public class OperationDemo {
	public static void main(String[] args) {
		//1.算数运算符
		//注意:Java中两种数据类型进行运算,结果是数据类型较大大的一方;
		System.out.println(1 + 2);//3
		//+除了算数加功能以外还有另外一个功能:字符串拼接
		String name = "小明";
		double score = 90;
		System.out.println(name + "的数学考试分数为:" + score + "分.");

		System.out.println(1 - 2);//-1
		System.out.println(1 * 2);//2
		System.out.println(1 / 2);//0
		System.out.println(1.0 / 2);//0.5
		// 两种相同数据类型进行运算,结果使其本身!
		System.out.println(1 % 2);//1

		System.out.println("----------------------");

		//2.赋值运算符
		//=表示赋值,把字面量3赋值给整数类型的变量i
		int num = 3;

		//+=,-=,*=,/=...
		/*
		 * 	相当于num = num + 1;但是有差别,
		 * num+=1的写法可以避免类型转换警告风险,但是计算结果不保证正确!
		 */
		num += 1;
		System.out.println(num);

		System.out.println("----------------------");

		/*
		 *  自增/自减			++/--		前++/后++		前--/后--
		 *  
		 *  注意:
		 *  后++,表示先赋值,后运算
		 *  前++,表示先计算,后赋值,
		 *  
		 *  先看到变量,则先赋值;先看到运算符,则先计算
		 */
		/*int a = 10, b = 5;
		链式赋值
		int x, y, z;
		x = y = z = 10;*/

		int a = 10, b = 5;
		int r = a++ + ++b + ++a;
		System.out.println(r);//10 + 6 + 12

		//此处a=12
		int r2 = ++a + a++ - b--;
		System.out.println(r2);//13 + 13 - 6 = 20

		System.out.println("----------------------");

		//3.比较运算符,返回结果是布尔类型
		System.out.println(2 < 3);
		System.out.println(2 > 3);
		System.out.println(2 >= 3);
		System.out.println(2 != 3);

		System.out.println("----------------------");

		//4.逻辑运算符
		//&&逻辑与,并且,同真为真,有一个是假,结果即为假
		/*
		 * 		&&		短路型逻辑与
		 * 		&			非短路型逻辑与
		 * 
		 * 		区别:
		 * 		&&当表达式一个部分已经可以决定最终结果时,第二段不执行
		 * 		&无论前后两个部分结果如何,都会执行
		 *     
		 *      短路型可以提交程序执行性能!
		 */
		System.out.println(2 > 3 && 3 < 4);

		//|| 短路或,只要有一个为真,结果即为真
		System.out.println(5 > 3 || 3 < 4);

		//非
		System.out.println(!(3 > 4));

		System.out.println("----------------------");

		//5.位运算符
		//注意:直接操作底层二进制,性能更高
		/*
		 * 按位与
		 * 0当做false,1当做true
		 * 同1为1,同0为0,不同为0
		 * 
		 * 		00000000 00000000 00000000 00000011
		 * &	00000000 00000000 00000000 00000101
		 * --------------------------------------------------
		 * 		000000000000000000000000000000001
		 */
		System.out.println(3 & 5);//1

		/*
		 * 按位或
		 * 0当做false,1当做true
		 * 同1为1,同0为0,不同为1
		 * 
		 * 		00000000 00000000 00000000 00000011
		 * |	00000000 00000000 00000000 00000101
		 * --------------------------------------------------
		 * 		000000000000000000000000000000111
		 */
		System.out.println(3 | 5);//7

		/*
		 * 按位异或
		 * 相同为0,不同为1
		 * 
		 * 		00000000 00000000 00000000 00000011
		 * ^	00000000 00000000 00000000 00000101
		 * --------------------------------------------------
		 * 		000000000000000000000000000000110
		 * ^  00000000 00000000 00000000 00000101
		 * --------------------------------------------------
		 *     00000000 00000000 00000000 00000011
		 */
		System.out.println(3 ^ 5);//6

		//结论:一个数字连续异或同一个数字两次,结果是它本身!
		//使用场景:加密
		System.out.println(8888 ^ 123456 ^ 123456);//3

		//位移运算
		//注意:不存在无符号左移!
		System.out.println(16 >>> 2);

		//按位取反
		System.out.println(~8);//-9

		/*
		 * 		公式:
		 * 		~x = -(x + 1)
		 * 		==>
		 * 		-x = ~x + 1
		 * 		
		 *		 	00000000 00000000 00000000 00001000		8
		 *	~		11111111 11111111 11111111 11110111		-9
		 *	+1	11111111 11111111 11111111 11111000     -8
		 */

		//三元运算符
		System.out.println(2 > 1 ? "正确" : "不正确");
	}
}
